package com.xinz.protocal;

import java.io.IOException;
import java.lang.reflect.Method;

import com.xinz.protocal.server.NativeMethod;


/**
 * Serializer用于帮助NativeInvoker和RemoteInvoker序列化和反序列化方法，方法参数以及方法返回
 * @author xingyun
 *
 */
public interface Serializer {

	/**
	 * 从Buffer里解析出一个返回对象或者异常
	 * @param context
	 * @param result
	 * @param responseHeader
	 * @return 正常返回的对象
	 * @throws Throwable 远程返回的异常
	 */
	Object parseReturn(Session session, Buffer result, Object[] responseHeader) throws Throwable;
	
	/**
	 * 把方法和参数序列化到Buffer中
	 * @param context
	 * @param method
	 * @param header
	 * @param args
	 * @return
	 * @throws IOException 
	 */
	Buffer methodToBuffer(Session session, Method method, Object header, Object[] args) throws IOException;
	
	/**
	 * 从Buffer中解析一个方法和参数
	 * @param context
	 * @param request
	 * @return
	 */
	NativeMethod parseMethod(Session session, Buffer request);
	
	/**
	 * 转换成返回Buffer
	 * @param context
	 * @param header
	 * @param result
	 * @param isException
	 * @return
	 */
	Buffer returnToBuffer(Session session, Object header, Object result, boolean isException);
}
